//: [Previous](@previous)
/*:
 
 #13 [Roman to Integer](https://leetcode.com/problems/roman-to-integer/description/)
 
 Roman numerals are represented by seven different symbols: `I`, `V`, `X`, `L`, `C`, `D` and `M`.
 
 罗马数字由7中不同符号表示：I、V、X、L、C、D、M
 
 ```
 Symbol       Value
 I             1
 V             5
 X             10
 L             50
 C             100
 D             500
 M             1000
 ```
 
 For example, two is written as `II` in Roman numeral, just two one's added together. Twelve is written as, `XII`, which is simply `X` + `II`. The number twenty seven is written as `XXVII`, which is `XX` + `V` + `II`.
 
 Roman numerals are usually written largest to smallest from left to right. However, the numeral for four is not `IIII`. Instead, the number four is written as `IV`. Because the one is before the five we subtract it making four. The same principle  Roman numerals are represented by seven different symbols: `I`, `V`, `X`, `L`, `C`, `D` and `M`.
 to the number nine, which is written as `IX`. There are six instances where subtraction is used:
 
 * `I` can be placed before `V` (5) and `X` (10) to make 4 and 9.
 * `X` can be placed before `L` (50) and `C` (100) to make 40 and 90.
 * `C` can be placed before `D` (500) and `M` (1000) to make 400 and 900.
 * Given a roman numeral, convert it to an integer. Input is guaranteed to be within the range from 1 to 3999.
 
 Example 1:
 ```
 Input: "III"
 Output: 3
 ```
 
 Example 2:
 ```
 Input: "IV"
 Output: 4
 ```
 
 Example 3:
 ```
 Input: "IX"
 Output: 9
 ```
 
 Example 4:
 ```
 Input: "LVIII"
 Output: 58
 Explanation: L = 50, V= 5, III = 3.
 ```
 
 Example 5:
 ```
 Input: "MCMXCIV"
 Output: 1994
 Explanation: M = 1000, CM = 900, XC = 90 and IV = 4.
 ```
 
 */
import Foundation

private extension String {
    subscript (index: Int) -> Character {
        return self[self.index(self.startIndex, offsetBy: index)]
    }
}

class Solution {
    func romanToInt(_ s: String) -> Int {
        var result = 0
        for i in (0..<s.count).reversed() {
            let c: Character = s[i]
            switch c {
            case "M":
                result += 1000
            case "D":
                result += 500
            case "C":
                result += 100 * (result >= 500 ? -1 : 1)
            case "L":
                result += 50
            case "X":
                result += 10 * (result >= 50 ? -1 : 1)
            case "V":
                result += 5
            case "I":
                result += result >= 5 ? -1 : 1
            default:
                break
            }
        }
        return result
    }
}

print(Solution().romanToInt("III"))
print(Solution().romanToInt("IV"))
print(Solution().romanToInt("IX"))
print(Solution().romanToInt("LVIII"))
print(Solution().romanToInt("MCMXCIV"))


//: [Next](@next)
